package java8.stream.utility;// Returns a stream of all the sublists of its input list

import java.util.Collections;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 *
 * 原理：
 * 例如，（a，b，c）的前缀是（a），（a，b）和（a，b，c）。
 * 前缀列表的后缀列表，（a） 的后缀列表为（a） , （a，b） 的后缀列表为(a,b) (b) ,（a，b，c） 的后缀列表为 (a,b,c) (b,c) (c)
 *
 * 列表的子列表只是前缀的后缀和空列表
 *
 *
 *
 * 此处和PowerSet 不完全一样,SubLists 包换的是连续的。例如
 * [a,b,c]
 * PowerSet 中包括 [a,c]
 * 但是SubLists 不包括[a,c]
 *
 *
 *
 */
public class SubLists {
    public static <E> Stream<List<E>> of(List<E> list) {
        return Stream.concat(Stream.of(Collections.emptyList()),
                prefixes(list).flatMap(SubLists::suffixes));
    }

    //rangeClosed包含最后的结束节点，range不包含。
    private static <E> Stream<List<E>> prefixes(List<E> list) {
        return IntStream.rangeClosed(1, list.size()).mapToObj(end -> list.subList(0, end));
    }

    private static <E> Stream<List<E>> suffixes(List<E> list) {
        return IntStream.range(0, list.size()).mapToObj(start -> list.subList(start, list.size()));
    }

   public static void main(String[] args) {
      /*List s = List.of("a", "b", "c","d");
      Stream collection = SubLists.of(s);
      collection.forEach(System.out::println);*/
   }

}